package com.ww.learn.coroutine.cancel

import kotlinx.coroutines.*
import java.net.URL

suspend fun fetchResponse(code: Int, delay: Int) = coroutineScope {
    try {
        val response = async {
            URL("http://www.baidus.com").readText()
        }.await()
        println(response)
    } catch (ex: CancellationException) {
        println("${ex.message} for fetchResponse $code")
    }
}

fun main() = runBlocking {
    val handler = CoroutineExceptionHandler { _, ex ->
        println("Exception handled: ${ex.message}")
    }
    val job = launch(Dispatchers.IO + handler) {
        // supervisorJob
        // 是一种特殊的Job，用于构建协程层级
        // 子协程不会取消其他子协程或父协程
        // supervisorScope {}
        // 是一个挂起函数，创建一个临时的监督作用域
        // 在该作用域内，子协程之间异常互不影响

        // 使用场景
        // 多个子任务并发执行，其中一个失败不影响其他任务
        // 例如：并行加载多个模块、网络请求、UI组件等
        supervisorScope {
            launch { fetchResponse(200, 5000) }
            launch { fetchResponse(202, 1000) }
            launch { fetchResponse(404, 2000) }
        }
    }
    Thread.sleep(4000)
    println("200 should still be running at this time")
    println("let the parent cancel now")
    job.cancel()
    job.join()
}